package com.example.demo.controller;


import com.example.demo.mapper.UserMapper;
import com.example.demo.pojo.*;
import com.example.demo.service.RechargeService;
import com.example.demo.service.UserService;
import com.example.demo.utils.AliOssUtil;
import com.example.demo.utils.BillPdfUtil;
import com.example.demo.utils.RechargePdfUtil;
import com.example.demo.utils.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/recharge")
public class RechargeController {

    @Autowired
    private RechargeService rechargeService;
    @Autowired
    private UserService userService;

    public boolean Authentication() {
        Map<String, Object> map = ThreadLocalUtil.get();
        String phonenumber = (String) map.get("phonenumber");
        User u = userService.findByphoneNumber(phonenumber);
        if (u.getUsertype() != 1) {
            return false;
        }
        return true;
    }

    @GetMapping("/downloadrecharge")
    public Result<String> downloadrecharge(@RequestParam Integer recordid) throws Exception {
        Recharge recharge = rechargeService.getByrecordid(recordid); // 获取账单信息
        RechargePdfUtil generator = new RechargePdfUtil();
        ByteArrayOutputStream byteArrayOutputStream = generator.createPdf(recharge);

        // 使用UUID生成文件名
        String filename = "Recharge_" + recordid + ".pdf";
        String fileUuid = UUID.randomUUID().toString() + ".pdf";

        // 上传PDF文件到OSS
        String url = AliOssUtil.uploadFile(fileUuid, new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));

        // 返回文件下载URL
        return Result.success(url);
    }



    /**
     * 通过GET请求获取用户充值信息。
     *
     * 本方法旨在提供一个接口，供外部系统查询特定用户的充值记录。
     * 它通过ThreadLocal获取当前线程中的用户ID，然后调用充值服务查询该用户的充值信息。
     * 最后，将查询结果封装在Result对象中返回，以便调用方处理。
     *
     * @return Result<List<Recharge>> 包含用户充值记录的Result对象，如果查询成功，Result的状态码为200，数据部分为充值记录列表；如果查询失败，Result中将包含错误信息。
     */
    @GetMapping("/rechargeinfo")
    public Result<PageBean<Recharge>> rechargeinfo(@RequestParam(required = false) int pageNum,
                                               @RequestParam(required = false) int pageSize) {
        // 从ThreadLocal中获取当前线程绑定的用户ID，用于查询充值信息。
        Map<String,Object> map= ThreadLocalUtil.get();
        int userid = (int) map.get("userid");

        // 调用充值服务，根据用户ID查询充值记录。
        PageBean<Recharge> rechargePage = rechargeService.findByUserid(userid, pageNum, pageSize);

        // 将查询结果封装在Result对象中返回。
        return Result.success(rechargePage);
    }

    @GetMapping("/r-rechargeinfo")
    public Result<PageBean<Recharge>>r_rechargeinfo(@RequestParam(required = false) int pageNum,
                                                   @RequestParam(required = false) int pageSize,
                                                    @RequestParam(required = false) String realname) {
        if(!Authentication()){
            return Result.error("权限不足");
        }
        // 调用充值服务，根据用户realname查询充值记录。
        PageBean<Recharge> rechargePage = rechargeService.findByrealname(realname,pageNum, pageSize);

        // 将查询结果封装在Result对象中返回。
        return Result.success(rechargePage);
    }



    @PostMapping("/newrecharge")
    public Result newrecharge(@Pattern(regexp = "^\\S{4,5}$") String paymentmethod,Double amount) {
        Map<String,Object> map= ThreadLocalUtil.get();
        String phonenumber = (String) map.get("phonenumber");
        User u = userService.findByphoneNumber(phonenumber);
        rechargeService.rechargemoney(paymentmethod,amount,u.getAccountbalance()+amount,u.getUserid());
//        userService.updatebalance(u.getAccountbalance()+amount);
        return Result.success();
    }

    @PostMapping("/cancelrecharge")
    public Result deleterecharge(@RequestParam Integer recordid) {
        rechargeService.cancelrecharge(recordid);
        return Result.success();
    }

}
